 /**
 * @func 手写深拷贝
 * @param {any} target 
 * @param {any} hash 
 * @returns 
 */
function deepClone(target,hash = new WeekMap()){ // 额外开辟一个存储空间来存储当前对象和拷贝对象的对应关系
    if(target === null)  return target; // 处理 null
    if(target instanceof Date)  return new Date(target); // 处理日期
    if(target instanceof RegExp)  return new RegExp(target); // 处理正则

    if(typeof target !== 'object'){ // 如果是原始类型，无需继续拷贝，直接返回
        return target;
    }

    // 如果是引用类型，递归实现每一层的拷贝
    if(hash.get(target))  return hash.get(target)
    const cloneTarget =new target.constructor(); // 创建一个新的克隆对象或克隆数组
    hash.set(target,cloneTarget);

    // 使用 Reflect.ownKeys 替换 for in 遍历对象。可以处理Symbol作为键
    Reflect.ownKeys(target).forEach(key => {
        cloneTarget[key] = deepClone(target[key],hash); // 递归拷贝每一层
    })
    return cloneTarget;
}

// 测试
const obj = {
    person: {
      name: 'lin'
    }
}
  
const newObj = deepClone(obj)
obj.person.name = 'xxx' // 改变原来的对象
  
console.log('原来的对象', obj)
console.log('新的对象', newObj)
  
console.log('更深层的指向同一地址', obj.person == newObj.person)
